home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <ctype.h>
- #include "defs.h"
- #include "oaklib.h"
-
- #define MAX_MAC 512
-
- extern char *Act_vram();
- extern void wrtstr();
- extern void memcpy();
- extern void memset();
- extern int strlen();
- extern void locate();
- extern void Dsp_box_vram();
- extern char *SPCSTR;
-
- short ReWrt_flg=FALSE;
-
- static struct _MACRO {
- int mc_ch;
- unsigned mc_ec;
- } mac_key[MAX_MAC+1];
- static int mac_cnt=0;
- static int mac_max=0;
- static int mac_flg=0;
-
- static int ch_bak;
- static unsigned ec_bak;
- static int hit_flg=FALSE;
-
- void putmode(int md,int sf,char *str)
- {
- wrtstr(str,71,MENU_Y,0x1F);
- }
- void putsys(int len,char *str,char *att)
- {
- int n,Bak_X,Bak_Y;
- char *vp;
- static int Bak_len=0;
- static char *Bak_vp=NULL;
- static char Bak_vram[160];
-
- Bak_X = Cur_X; Bak_Y = Cur_Y;
- Cur_X = 0 ; Cur_Y = MENU_Y-OFF_Y;
-
- if ( Bak_len > 0 )
- memcpy(Bak_vp,Bak_vram,Bak_len * 2);
-
- Bak_vp = Act_vram();
- memcpy(Bak_vram,Bak_vp,len * 2);
-
- n = len;
- vp = Bak_vp;
- while ( n-- > 0 ) {
- *(vp++) = (*(att++) & 0x0F) | 0x38;
- if ( iskanji((UCHAR)*str) ) {
- *(vp-1) |= 0x40;
- *(vp++) = *(str++);
- *(vp++) = (*(att++) & 0x0F) | 0x80;
- *(vp++) = *(str++);
- n--;
- } else
- *(vp++) = *(str++);
- }
-
- Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
-
- Bak_len = len;
- Cur_X = Bak_X; Cur_Y = Bak_Y;
- }
- void putstr(int pos,int len,char *str,char *att)
- {
- int n;
- char *vp;
- static int Bak_len=0;
- static char *Bak_vp=NULL;
- static char Bak_vram[160];
-
- if ( Bak_len > 0 )
- memcpy(Bak_vp,Bak_vram,Bak_len * 2);
-
- Bak_vp = Act_vram();
- memcpy(Bak_vram,Bak_vp,len * 2 + 2);
-
- vp = Bak_vp;
- for ( n = 0 ; n < len ; n++ ) {
- *(vp++) = (*(att++) & 0x0F) | (n == pos ? 0x30 : 0x38);
- if ( iskanji((UCHAR)*str) ) {
- *(vp-1) |= 0x40;
- *(vp++) = *(str++);
- *(vp++) = (*(att++) & 0x0F) | 0x80;
- *(vp++) = *(str++);
- n++;
- } else
- *(vp++) = *(str++);
- }
- if ( len > 0 && n == pos ) {
- *vp |= 0x17;
- len++;
- }
-
- Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
- Bak_len = len;
- }
- void Ent_sub(sw)
- int sw;
- {
- char bk,*vp;
-
- vp = (char *)Act_vram();
- if ( sw == FALSE ) {
- *vp &= 0xDF;
- Dsp_box_vram(1,0x07);
- } else {
- bk = *vp;
- *vp = (*vp & 0xC0) | 0x3C;
- Dsp_box_vram(1,0x07);
- *vp = bk;
- }
- }
- void Ent_tango(arg)
- char *arg;
- {
- int i,j,ch,sc;
- unsigned ec;
- int Ent_X,Ent_Y;
- int Bak_X,Bak_Y;
- char *vp,*Ent_vp,*End_vp;
- char att[80];
-
- Bak_X = Cur_X; Bak_Y = Cur_Y;
- Ent_sub(TRUE);
- *arg = '\0';
-
- memset(att,0x00,10);
- memset(att + 10,0x01,53);
- putsys(63,
- "単語登録 登録位置にカ-ソルを移動して実行キ-を押してください ",
- att);
-
- for ( ; ; ) {
- ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
- Ent_sub(FALSE);
- if ( sc == 0x4F ) {
- if ( --Cur_X < 0 )
- Cur_X = MAX_X - 1;
- vp = (char *)Act_vram();
- if ( (*vp & 0x80) != 0 && Cur_X > 0 )
- Cur_X--;
- } else if ( sc == 0x51 && ++Cur_X >= MAX_X )
- Cur_X = 0;
- else if ( sc == 0x4D && --Cur_Y < 0 )
- Cur_Y = MENU_Y - 3;
- else if ( sc == 0x50 && ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = 0;
- else if ( sc == 0x72 )
- goto ENDOF;
- else if ( sc == 0x73 )
- break;
- vp = (char *)Act_vram();
- if ( (*vp & 0x80) != 0 && Cur_X < (MAX_X - 1) )
- Cur_X++;
- Ent_sub(TRUE);
- }
-
- Ent_X = Cur_X; Ent_Y = Cur_Y;
- Ent_vp = (char *)Act_vram();
-
- putsys(36,
- "単語登録 登録範囲を指定してください",
- att);
-
- Cur_X = Ent_X ; Cur_Y = Ent_Y;
-
- for ( ; ; ) {
- ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
- if ( sc == 0x4F ) {
- vp = (char *)Act_vram();
- if ( vp > Ent_vp ) {
- if ( --Cur_X < 0 ) {
- Cur_X = MAX_X - 1;
- if ( Cur_Y > 0 )
- Cur_Y--;
- }
- vp = (char *)Act_vram();
- if ( Cur_X > 0 && (*vp & 0x80) != 0 )
- Cur_X--;
- Ent_sub(FALSE);
- }
- } else if ( sc == 0x51 ) {
- Ent_sub(TRUE);
- vp = (char *)Act_vram();
- if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
- Cur_X += 2;
- else
- Cur_X++;
- if ( Cur_X >= MAX_X ) {
- Cur_X -= MAX_X;
- if ( ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = MENU_Y - 3;
- }
- } else if ( sc == 0x72 )
- goto CLROF;
- else if ( sc == 0x73 )
- break;
- }
- End_vp = (char *)Act_vram();
- for ( vp = Ent_vp ; vp < End_vp ; vp+=2 ) {
- if ( (unsigned char)(*(arg++) = *(vp+1)) < ' ' )
- *(arg-1) = ' ';
- }
- *arg = '\0';
- CLROF:
- i = Cur_X; j = Cur_Y;
- Cur_X = Ent_X; Cur_Y = Ent_Y;
- for ( ; ; ) {
- Ent_sub(FALSE);
- vp = (char *)Act_vram();
- if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
- Cur_X += 2;
- else
- Cur_X++;
- if ( Cur_X >= MAX_X ) {
- Cur_X -= MAX_X;
- if ( ++Cur_Y > (MENU_Y - 3) )
- Cur_Y = MENU_Y - 3;
- }
- if ( Cur_Y >= j && Cur_X >= i )
- break;
- }
- ENDOF:
- Cur_X = Bak_X; Cur_Y = Bak_Y;
- locate();
- }
- void Tango_Touroku()
- {
- int len;
- char tmp[160];
-
- Ent_tango(tmp);
- if ( (len = strlen(tmp)) > 0 )
- KAN_touroku(len,tmp);
- putsys(0,"","");
- }
- /******************* Debug Code *******************
- void deb_dsp(ch,ec)
- int ch,ec;
- {
- char tmp[40];
-
- sprintf(tmp,"CH=%04X EC=%04X",ch,ec);
- wrtstr(tmp,0,0,0x1F);
- }
- ****************************************************/
-
- void mac_save()
- {
- switch(mac_flg) {
- case 0: case 2:
- mac_flg = 1;
- mac_max = 0;
- wrtstr("只今キ-マクロを定義中です",30,1,0x15);
- break;
- case 1:
- mac_flg = 2;
- mac_cnt = 0;
- mac_max--;
- wrtstr(SPCSTR,30,1,0x1F);
- break;
- }
- }
- void mac_go()
- {
- if ( mac_flg == 2 ) {
- mac_flg = 3;
- mac_cnt = 0;
- }
- }
- int kbhit()
- {
- if ( hit_flg != FALSE )
- return 1;
-
- if ( mac_flg == 3 ) {
- if ( mac_cnt < mac_max ) {
- hit_flg = TRUE;
- ch_bak = mac_key[mac_cnt].mc_ch;
- ec_bak = mac_key[mac_cnt].mc_ec;
- mac_cnt++;
- return 1;
- } else {
- mac_flg = 2;
- mac_cnt = 0;
- }
- }
-
- while ( (ch_bak = KAN_read(1,&ec_bak)) != 0xFFFF ) {
- if ( ch_bak & 0x8000 || (ec_bak & 0xFF00) > 0x5100 )
- ch_bak = 0xFFFF;
- switch(ec_bak & 0xFF00) {
- case 0xFF00:
- break;
-
- case 0x6D00:
- Tango_Touroku();
- break;
-
- default:
- hit_flg = TRUE;
- if ( mac_flg == 1 && mac_max < MAX_MAC ) {
- mac_key[mac_max].mc_ch = ch_bak;
- mac_key[mac_max].mc_ec = ec_bak;
- mac_max++;
- }
- return 1;
- }
- }
- return 0;
- }
- int Get_key(ec)
- unsigned *ec;
- {
- while ( kbhit() == 0 );
- hit_flg = FALSE;
- *ec = ec_bak & 0xFF14;
- return ch_bak;
- }
- int getch()
- {
- int ch;
- unsigned ec;
-
- while ( (ch = Get_key(&ec)) == 0xFFFF );
- return ch;
- }